package com.syg.servlet03;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.Map;

/**
 * 获取客户端通过Form表单提交上来的参数
 *
 *      getParameter(String)方法(常用)
 *      getParameterValues(String name)方法(常用)
 *      getParameterNames()方法(不常用)
 *      getParameterMap()方法(编写框架时常用)
 */
@WebServlet("/reqParam")
public class _08_Request_Param extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.getServletContext().getRequestDispatcher("/WEB-INF/JspPage/servlet03/_08_Request_Param.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //客户端是以UTF-8编码提交表单数据的，所以需要设置服务器端以UTF-8的编码进行接收，否则对于中文数据就会产生乱码
        req.setCharacterEncoding("UTF-8");

        /**
         * 编&nbsp;&nbsp;号(文本框)：
         <input type="text" name="userid" value="NO." size="2" maxlength="2">
         */
        String userId = req.getParameter("userid");//获取填写的编号，userid是文本框的名字(name属性)，<input type="text" name="userid">

        /**
         * 用户名(文本框)：<input type="text" name="username" value="请输入用户名">
         */
        String username = req.getParameter("username");//获取填写的用户名,后台不会获取placeholder属性的值

        String userPass = req.getParameter("userpass");//获取填写的密码

        String sex = req.getParameter("sex");//获取单选框的值

        String dept = req.getParameter("dept");//获取下拉框的值

        //获取选中的兴趣，因为可以选中多个值，所以获取到的值是一个字符串数组，因此需要使用getParameterValues方法来获取
        String[] valuesArr = req.getParameterValues("inst");//获取复选框的值
        String instStr="";
        /**
         * 获取数组数据的技巧，可以避免valuesArr数组为null时引发的空指针异常错误！同时可以去除最后一个逗号
         */
        for (int i = 0; valuesArr!=null && i < valuesArr.length; i++) {
            if (i == valuesArr.length-1) {
                instStr+=valuesArr[i];
            }else {
                instStr+=valuesArr[i]+",";
            }
        }

        String note = req.getParameter("note");//获取文本域的值
        String hiddenField = req.getParameter("hiddenField");//获取隐藏域的值

        System.out.println("编号(name=\"userid\")==>"+userId);
        System.out.println("用户名(name=\"username\")==>"+username);
        System.out.println("密码(name=\"userpass\")==>"+userPass);
        System.out.println("性别(name=\"sex\")==>"+sex);
        System.out.println("部门(name=\"dept\")==>"+dept);
        System.out.println("兴趣(name=\"instStr\")==>"+instStr);
        System.out.println("文本域(name=\"note\")==>"+note);
        System.out.println("隐藏域(name=\"hiddenField\")==>"+hiddenField);

        resp.setContentType("text/html;charset=utf-8");
        //获取响应输出流
        PrintWriter respOut = resp.getWriter();
        respOut.write("编号(name=\"userid\")==>"+userId);
        respOut.write("<br/>");
        respOut.write("用户名(name=\"username\")==>"+username);
        respOut.write("<br/>");
        respOut.write("密码(name=\"userpass\")==>"+userPass);
        respOut.write("<br/>");
        respOut.write("性别(name=\"sex\")==>"+sex);
        respOut.write("<br/>");
        respOut.write("部门(name=\"dept\")==>"+dept);
        respOut.write("<br/>");
        respOut.write("兴趣(name=\"instStr\")==>"+instStr);
        respOut.write("<br/>");
        respOut.write("文本域(name=\"note\")==>"+note);
        respOut.write("<br/>");
        respOut.write("隐藏域(name=\"hiddenField\")==>"+hiddenField);

        respOut.write("<br/>");
        respOut.write("------------------------------我是另一种输出方式-----------------------------------");
        respOut.write("<br/>");

        String htmlStr = "<table>" +
                "<tr><td>填写的编号：</td><td>{0}</td></tr>" +
                "<tr><td>填写的用户名：</td><td>{1}</td></tr>" +
                "<tr><td>填写的密码：</td><td>{2}</td></tr>" +
                "<tr><td>选中的性别：</td><td>{3}</td></tr>" +
                "<tr><td>选中的部门：</td><td>{4}</td></tr>" +
                "<tr><td>选中的兴趣：</td><td>{5}</td></tr>" +
                "<tr><td>填写的说明：</td><td>{6}</td></tr>" +
                "<tr><td>隐藏域的内容：</td><td>{7}</td></tr>" +
                "</table>";
        htmlStr = MessageFormat.format(htmlStr, userId,username,userPass,sex,dept,instStr,note,hiddenField);
        respOut.write(htmlStr);//输出htmlStr里面的内容到客户端浏览器显示


        respOut.write("<br/>");
        respOut.write("-------------我是通过使用getParameterNames方法接收表单参数的方式(复选框的参数接受不全)-------------------");
        respOut.write("<br/>");
        Enumeration<String> paramNames = req.getParameterNames();//获取所有的参数名
        while (paramNames.hasMoreElements()) {
            String name = paramNames.nextElement();//得到参数名
            String value = req.getParameter(name);//通过参数名获取对应的值
            System.out.println(MessageFormat.format("{0}={1}", name,value));
            respOut.write(MessageFormat.format("{0}={1}", name,value)+"<br/>");
        }
        respOut.write("通过使用getParameterNames方法接收表单参数的方式(复选框的参数接受不全)");

        respOut.write("<br/>");
        respOut.write("-------------使用getParameterMap方法接收表单参数-------------------");
        respOut.write("<br/>");
        //request对象封装的参数是以Map的形式存储的
        Map<String, String[]> paramMap = req.getParameterMap();
        for(Map.Entry<String, String[]> entry :paramMap.entrySet()){
            String paramName = entry.getKey();
            String paramValue = "";
            String[] paramValueArr = entry.getValue();
            for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) {
                if (i == paramValueArr.length-1) {
                    paramValue+=paramValueArr[i];
                }else {
                    paramValue+=paramValueArr[i]+",";
                }
            }
            System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue));
        }
    }
}
